package tech.aistar.day10.syn;

/**
 * 本类用来演示: synchronized修饰方法
 *
 * @author: success
 * @date: 2022/8/1 1:39 下午
 */
public class SynMethodDemo implements Runnable{

    //1. 修饰一个普通方法
    //synchronized修饰的方法 - 同步代码
    //只有获取到"锁"资源的对象,才能够进入到同步代码去执行.其他线程在阻塞,等待
    //执行完代码之后,将会释放锁资源

    //隐式锁 - 自动申请锁和释放锁
    public synchronized void test(){
        //在某个时刻,只能由一个线程进入.
        System.out.println(Thread.currentThread().getName()+":enter~");
        try {
            //故意睡一秒,"嘚瑟一会"
            Thread.sleep(1000);//让出cpu.但是不会释放锁
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
       System.out.println(Thread.currentThread().getName()+":leave~");
    }

    public static synchronized void test2(){
        //在某个时刻,只能由一个线程进入.
        System.out.println(Thread.currentThread().getName()+":enter2~");
        try {
            //故意睡一秒,"嘚瑟一会"
            Thread.sleep(1000);//让出cpu.但是不会释放锁
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+":leave2~");
    }

    @Override
    public void run() {
        test2();
    }

    //2. 修饰一个静态方法
}
class SynMethodDemoTest{
    public static void main(String[] args) {
        Runnable r1 = new SynMethodDemo();
        Runnable r2 = new SynMethodDemo();
        Thread t1 = new Thread(r1);
        Thread t2 = new Thread(r2);

        t1.start();
        t2.start();
    }
}
